import type { VNode, VNodeChild } from 'vue';
import type { ListItemLayout, ListLocale, ListSize } from 'ant-design-vue/lib/list';
import type { PaginationProps } from '@/components/Table/src/types/pagination';
import { ListGridType } from 'ant-design-vue/lib/list';
import type { FormProps, ButtonProps } from '@/components/Form';
import type { AdDetailFormProps } from '@/components/AdTable/src/types/adDetailForm';
import { FetchSetting, SorterResult } from '@/components/Table';
import { AdColumn } from '@/components/AdTable';
import { PageRequest, PageData, FilterGroup } from '@/utils/common/types';
import { FormModeEnum } from '@/enums/formEnum';
import type { AdFetchParams } from '@/components/AdTable';

/** 列表设置 */
export interface ListSetting {
  redo?: boolean;
  size?: boolean;
  fullScreen?: boolean;
}

/** 高级列表选项 */
export interface AdListProps {
  /** 高度变量，计算高度的偏移。 */
  heightOffset?: number;
  /** 是否显示边框 */
  bordered?: boolean;
  /** 列表数据源 */
  dataSource?: Recordable[];
  // /** 列表底部 */
  // footer?: any;
  /** 列表栅格配置 */
  grid?: ListGridType;
  // /** 列表头部 */
  // header?: any;
  /** 设置 List.Item 布局, 设置成 vertical 则竖直样式显示, 默认横排 */
  itemLayout?: ListItemLayout;
  /** 当卡片内容还在加载中时，可以用 loading 展示一个占位 */
  loading?: boolean;
  // /** 加载更多 */
  // loadMore?: any;
  /** 默认文案设置，目前包括空数据文案 */
  locale?: ListLocale;
  /** 对应的 pagination 配置(https://www.antdv.com/components/pagination-cn/#API), 设置 false 不显示 */
  pagination?: boolean | PaginationProps;
  /** 自定义Item函数，也可使用 #renderItem="{item, index}" */
  renderItem?: ({ item, index }) => VNode;
  /** 各项 key 的取值，可以是字符串或一个函数 */
  rowKey?: (string | number) | ((item: any) => string | number);
  /** list 的尺寸 */
  size?: ListSize;
  /** 是否展示分割线 */
  split?: boolean;

  /** 列表设置 */
  listSetting?: false | ListSetting;

  // 自定义排序方法
  sortFn?: (sortInfo: SorterResult) => any;
  // 筛选方法
  filterFn?: (data: Partial<Recordable<string[]>>) => any;
  // 取消默认padding
  inset?: boolean;
  // 是否自动生成key
  autoCreateKey?: boolean;
  // 计算合计行的方法
  summaryFunc?: (...arg: any) => Recordable[];
  // 自定义合计表格内容
  summaryData?: Recordable[];
  // 是否显示合计行
  showSummary?: boolean;
  // 请求之前处理参数
  beforeFetch?: Fn;
  // 自定义处理接口返回参数
  afterFetch?: Fn;
  // 查询条件请求之前处理
  handleSearchInfoFn?: Fn;
  // 请求接口配置
  fetchSetting?: Partial<FetchSetting>;
  // 立即请求接口
  immediate?: boolean;
  // 在开起搜索表单的时候，如果没有数据是否显示
  emptyDataIsShow?: boolean;
  // 默认的排序参数
  defSort?: Recordable;

  // 是否继承父级高度（父级高度-表单高度-padding高度）
  isCanResizeParent?: boolean;
  // 是否可以自适应高度
  canResize?: boolean;
  // 是否紧凑型高度
  compactHeight?: boolean;
  // 自适应高度偏移， 计算结果-偏移量
  resizeHeightOffset?: number;

  // 标题右侧提示
  titleHelpMessage?: string | string[];
  // 列表滚动最大高度
  maxHeight?: number;

  /**
   * Callback executed when pagination, filters or sorter is changed
   * @param pagination
   * @param filters
   * @param sorter
   * @param currentDataSource
   */
  onChange?: (pagination: any, filters: any, sorter: any, extra: any) => void;

  /**
   * Table title renderer
   * @type Function | ScopedSlot
   */
  title?: VNodeChild | JSX.Element | string | ((data: Recordable) => string);

  /** 表格数据接口请求对象 */
  api?: (params: PageRequest) => Promise<PageData | any>;
  /** 额外的请求参数 */
  searchInfo?: FilterGroup;
  /** 列配置 */
  columns: AdColumn[];

  /** 搜索表单 */
  searchForm?:
    | false
    | {
        /** 在INPUT组件上单击回车时，是否自动提交 */
        autoSubmitOnEnter?: boolean;
        /** 是否在重置时重新发起请求 */
        submitOnReset?: boolean;
        /** 提交按钮配置 */
        submitButtonOptions?: Partial<ButtonProps>;
      };
  /** 详情表单 */
  detailForm?: AdDetailFormProps;

  /** 表单配置 */
  formConfig?: Partial<FormProps>;
}

/** 高级列表动作类型 */
export interface AdListActionType {
  /** 重新加载 */
  reload: (opt?: AdFetchParams) => Promise<Recordable<any>[] | undefined>;
  /** 滚动至 */
  scrollTo: (pos: number | 'top' | 'bottom') => void;
  /** 获取分页 */
  getPagination: () => PaginationProps | boolean;
  /** 设置分页 */
  setPagination: (info: Partial<PaginationProps>) => void;
  /** 获取分页是否显示 */
  getShowPagination: () => boolean;
  /** 设置分页是否显示 */
  setShowPagination: (show: boolean) => Promise<void>;
  /** 获取原始数据 */
  getRawDataSource: <T = Recordable>() => T;
  /** 获取搜索信息 */
  getSearchInfo: <T = Recordable>() => T;
  /** 获取列表数据 */
  getListData: <T = Recordable>() => T[];
  /** 设置列表数据 */
  setListData: <T = Recordable>(values: T[]) => void;
  /** 更新列表指定数据 */
  updateListData: (index: number, key: string, value: any) => Recordable;
  /** 更新列表指定记录 */
  updateListDataRecord: (rowKey: string | number, record: Recordable) => Recordable | void;
  /** 删除列表指定记录 */
  deleteListDataRecord: (rowKey: string | number | string[] | number[]) => void;
  /** 插入列表指定记录 */
  insertListDataRecord: (record: Recordable | Recordable[], index?: number) => Recordable[] | void;
  /** 查找列表指定记录 */
  findListDataRecord: (rowKey: string | number) => Recordable | void;
  /** 设置加载状态 */
  setLoading: (loading: boolean) => void;
  /** 设置参数 */
  setProps: (props: Partial<AdListProps>) => void;
  /** 重新构建高度 */
  redoHeight: () => void;
  /** 获取尺寸 */
  getSize: () => ListSize;
  /** 触发器 */
  emit?: EmitType;
  /** 打开详情表单 */
  openDetailForm: (formMode: FormModeEnum, record?: Recordable<any>) => void;
}
